/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ourpkr.controler;

import java.util.Vector;
import ourpkr.model.joueur.*;
import java.beans.*;
import ourpkr.model.joueur.bestiale.Bestiale;

/**
 *
 * @author niboucha
 */
public class PartieComplete extends Thread {

    private Vector<Joueur> joueurs;
    int tourNb = 0;
    
    public int getNbJoueurs(){
        return joueurs.size();
    }

    public synchronized void nextTour() {
        notifyAll();
    }

    private void setTourNb(int tourNb) {
        int old = this.tourNb;
        this.tourNb = tourNb;
        pcs.firePropertyChange("tourNb", old, this.tourNb);
    }

    public void setHuman(Humain human) {
        Humain old = this.human;
        this.human = human;
        pcs.firePropertyChange("human", old, this.human);
    }
    private Vector<Joueur> joueursFinis;
    public PropertyChangeSupport pcs;

    public Vector<Joueur> getJoueursFinis() {
        return joueursFinis;
    }
    public int bBlind = 10;
    private Tour tour;
    private Humain human;

    public Humain getHuman() {
        return human;
    }

    public Vector<Joueur> getJoueurs() {
        return joueurs;
    }

    public Joueur getJoueur(int nb) {
        for (int i = 0; i < joueurs.size(); i++) {
            if (joueurs.get(i).getNumber() == nb) {
                return joueurs.get(i);
            }
        }
        return null;
    }

    public PartieComplete() {
        //Ajout des joueurs
        pcs = new PropertyChangeSupport(this);
        joueurs = new Vector();
        joueursFinis = new Vector<Joueur>();
    }

    private void createPlayers() {
        setHuman(new Humain("Serge", 0));
        addJoueur(human);
        addJoueur(new Bestiale("La Grosse", 1));
        addJoueur(new IAta("Patrick Bruel", 2));
        pcs.firePropertyChange("playersCreated", null, joueurs);
    }

    public synchronized void play() {
        createPlayers();
        int i = 0;
        while (!partieFinie()) {
            setTourNb(tourNb + 1);
            setTour(new Tour());
            tour.joue();
            joueurs.add(joueurs.remove(0)); //Garder cette ligne tel quelle pour ne pas declencher le tir d'un event
            if (!partieFinie()) {
                pcs.firePropertyChange("tourFini", null, tour);
                try {
                    wait();
                } catch (Exception e) {
                }
            }
        }
    }

    public Tour getTour() {
        return tour;
    }

    public void setTour(Tour t) {
        Tour old = tour;
        tour = t;
        pcs.firePropertyChange("tour", old, tour);
    }

    public synchronized void addJoueur(Joueur j) {
        Vector<Joueur> old = joueurs;
        joueurs.add(j);
        pcs.firePropertyChange("joueurs", old, joueurs);
    }

    public boolean partieFinie() {
        for (int i = 0; i < joueurs.size() && i < 2; i++) {
            if (joueurs.get(i).getFortune() <= bBlind) {
                joueurs.get(i).setDealer(false);
                joueurs.get(i).setAlwaysInTour(false);
                joueurs.get(i).setLoose(true);
                joueurs.get(i).setPlaying(false);
                joueursFinis.add(joueurs.remove(i));
            }
        }
        return (joueurs.size() < 2);
    }

    public void run() {
        play();
    }

    public static void main(String[] args) {
        PartieComplete p = new PartieComplete();
        p.play();
    }
}
